package com.yuexunxinxi.carefree.controller;

import com.yuexunxinxi.carefree.entity.AUser;
import com.yuexunxinxi.carefree.entity.vo.AUserVo;
import com.yuexunxinxi.carefree.filter.SkipLogin;
import com.yuexunxinxi.carefree.service.a_user.AUserService;
import com.yuexunxinxi.carefree.utils.*;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;


/**
 * 作者: 李咨辰
 * 文件名: AUserController.java
 * 路径: com.yuexunxinxi.carefree.controller
 * 时间: 2024-10-05 11:31
 * 版本: 1.0
 * 描述: TODO 用户
 **/
@RestController
@RequestMapping("/user")
public class AUserController {

    /**
     * 调用业务层
     */
    @Resource
    private AUserService aUserService;


    /**
     * 账号密码登录
     *
     * @param map     用于传递手机号和密码
     * @param request 用于设置session和获取ip
     * @return R
     */
    @SkipLogin
    @PostMapping("/doLogin")
    public R doLogin(@RequestBody HashMap<String, String> map, HttpServletRequest request) {
        String phone = map.get("phone");
        String password = map.get("password");
        if (phone.equals("") || password.equals("")) {
            return R.error("手机号或密码不能为空！");
        }
        if (!phone.matches("^(1[3-9])\\d{9}$")) {
            return R.error("手机号格式不正确");
        }
        AUser aUser = aUserService.doLogin(phone, password, request);
        if (aUser != null) {
            if (null != RedisUtil.get("captcha:login-" + phone)) {
                RedisUtil.delKey("captcha:login-" + phone);
            }
            request.getSession().setAttribute("user", aUser);
            return R.ok(aUser).put("msg", "登录成功！");
        }
        return R.error("请输入正确的手机号或密码");
    }

    /**
     * 登录状态验证
     *
     * @param map     id、授权码
     * @param request 用于设置session
     * @return 登录对象
     */
    @SkipLogin
    @PostMapping("/loginStatus")
    public R loginStatus(@RequestBody HashMap<String, String> map, HttpServletRequest request) {
        AUser aUser = aUserService.loginStatus(map.get("id"), map.get("secret"), request);
        if (aUser != null) {
            request.getSession().setAttribute("user", aUser);
            return R.ok().put("data", aUser);
        }
        request.getSession().removeAttribute("user");
        return R.error("登录状态已过期，请重新登录！");
    }


    /**
     * 注册
     *
     * @param map     账号、密码、验证码
     * @param request 用于获取ip地址
     * @return json响应码
     */
    @SkipLogin
    @PostMapping("/captchaLogin")
    public R captchaLogin(@RequestBody HashMap<String, String> map, HttpServletRequest request) {
        String phone = map.get("phone");
        String captcha = map.get("captcha");
        if (phone.equals("") || captcha.equals("")) {
            return R.error("请输入手机号或验证码");
        }
        String redisCaptcha = RedisUtil.get("captcha:login-" + phone);
        if (redisCaptcha == null) {
            return R.error("验证码不存在或已过期");
        }
        if (!redisCaptcha.equals(captcha)) {
            return R.error("验证码不正确");
        }
        RedisUtil.delKey("captcha:login-" + phone);
        AUser aUser = aUserService.captchaLogin(phone, request);
        if (aUser != null) {
            request.getSession().setAttribute("user", aUser);
            return R.ok(aUser).put("msg", "登录成功");
        }
        return R.error("请输入正确的账号或密码");
    }

    /**
     * 获取验证码
     *
     * @param map 手机号
     * @return json响应码
     */
    @SkipLogin
    @PostMapping("/captCha")
    public R captCha(@RequestBody HashMap<String, String> map) {
        String phone = map.get("phone");
        if (phone.equals("")) {
            return R.error("请输入手机号");
        }
        if (!phone.matches("^(1[3-9])\\d{9}$")) {//手机号
            return R.error("手机号格式不正确");
        }
        if (null != RedisUtil.get("captcha:login-" + phone)) {
            return R.error("请不要频繁获取验证码");
        }
        String captcha = CaptchaUtil.phone(phone);
        //将信息存入redis
        RedisUtil.set("captcha:login-" + phone, captcha);
        //设置过期时间为300秒
        RedisUtil.expire("captcha:login-" + phone, 300);
        return R.ok("验证码发送成功，请注意查收");
    }


    /**
     * 修改用户
     *
     * @param aUser 用户类
     * @return 成功返回true
     */
    @PatchMapping("/editUser")
    public R editUser(@RequestBody AUserVo aUser, HttpServletRequest request) {
        if (aUser.getAvatar() != null && !aUser.getAvatar().equals("")) {
            String avatar = aUserService.getAvatarById(aUser.getId());
            if (!AlibabaOSS.delFile(avatar)) {
                return R.error("修改失败");
            }
        }
        System.out.println(aUser.getId());
        return aUserService.editUser(aUser, request);

    }
//
//    /**
//     * 更改用户名称
//     *
//     * @param aUser 用户类
//     * @return 成功信息
//     */
//    @PatchMapping("/updateUserName")
//    public R updateUserName(@RequestBody AUser aUser, HttpServletRequest request) {
//        if (aUser.getId() != null && aUser.getName() != null && !"".equals(aUser.getName())) {
//            if (aUserService.updateUser(aUser, request)) {
//                return R.ok("名称修改成功！");
//            }
//        }
//        return R.error("参数不正确");
//    }
//
//
//    /**
//     * 更改用户签名
//     *
//     * @param aUser 用户类
//     * @return 成功信息
//     */
//    @PatchMapping("/updateUserIntro")
//    public R updateUserIntro(@RequestBody AUser aUser, HttpServletRequest request) {
//        if (aUser.getId() != null && aUser.getIntro() != null && !"".equals(aUser.getIntro())) {
//            if (aUserService.updateUser(aUser, request)) {
//                return R.ok("签名修改成功！");
//            }
//        }
//        return R.error("参数不正确");
//    }
//
//
//    /**
//     * 更改用户头像
//     *
//     * @param aUser 用户类
//     * @return 成功信息
//     */
//    @PatchMapping("/updateUserAvater")
//    public R updateUserAvater(@RequestBody AUser aUser, HttpServletRequest request) {
//        if (aUser.getId() != null && aUser.getAvatar() != null && !"".equals(aUser.getAvatar())) {
//            if (aUserService.updateUser(aUser, request)) {
//                return R.ok("头像修改成功！");
//            }
//        }
//        return R.error("参数不正确");
//    }
}
